热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

结语|《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法

篇首语:本文由编程笔记#小编为大家整理,主要介绍了《有趣的二进制:软件安全与逆向分析》读书笔记:通过逆向工程学习如何读懂二进制代码相关的知识,希望对你有一定的参考价值。 目录 前言一、软件分析体验1

篇首语:本文由编程笔记#小编为大家整理,主要介绍了《有趣的二进制:软件安全与逆向分析》读书笔记:通过逆向工程学习如何读懂二进制代码相关的知识,希望对你有一定的参考价值。



目录


  • 前言
  • 一、软件分析体验
    • 1、通过 Process Monitor 的日志来确认程序的行为
    • 2、从注册表访问中能发现些什么
    • 3、小结

  • 二、静态分析体验
    • 1、WinHex 查看文件内容
    • 2、IDA 反汇编

  • 三、动态分析体验
    • 1、 Process Monitor 跟踪
    • 2、OllyDbg 调试

  • 四、基础汇编指令
    • 1、常用汇编指令
    • 2、参数存放在栈中
    • 3、例子

  • 结语


前言

上一篇学完内网之后,打算学习一些逆向相关知识

本篇开始阅读学习《有趣的二进制:软件安全与逆向分析》,本章是通过逆向工程学习如何读懂二进制代码,主要是体验软件分析、静态分析和动态分析(可以理解为怕劝退读者)

作者有句话很有意思:



在编写这本书的过程中,我再一次感到,在不计其数的编程语言中,汇编语言是最‘有趣’的一种


配套资源在:https://github.com/shyujikou/binarybook


一、软件分析体验

首先是一些工具安装:


  • 二进制编辑 WinHex:建议到吾爱破解下载
  • 网络监控 Wireshark:https://www.wireshark.org/
  • 文件和注册表监控 Process Monitor:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procmon
  • 反汇编 IDA:建议到吾爱破解下载
  • 调试器 OllyDbg:建议到吾爱破解下载

本节要用到的是 chap01\\sample_mal\\Release 目录中的 sample_mal.exe 文件


1、通过 Process Monitor 的日志来确认程序的行为

sample_mal.exe 文件运行后,弹出一个内容为“Hello Malware!”的对话框,如下:


Process Monitor 的日志如下:


可以看到 sample_mal.exe 文件连续执行了 CreateFile、WriteFile 和 CloseFile 这几个操作,这些操作加起来的功能相当于在指定文件夹创建并写入一个名为 0.exe 的文件

进入C:\\Users\\ 用户名 \\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup可以看到 0.exe 文件

用 Winhex 与 sample_mal.exe 文件进行对比,发现两个文件完全一致

此外,sample_mal.exe 还在 我的文档 目录下创建了1.exe文件:


2、从注册表访问中能发现些什么

Windows 重启时自动运行的程序可以注册在下列任一注册表的位置:


  • HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run
  • HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run
  • HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce
  • HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce

可以发现注册表里面的确注册了 C:\\Documents and Settings\\XPMUser\\My Documents\\1.exe 这样的内容


3、小结

通过上述,sample_mal.exe 程序会执行以下操作:


  • 修改注册表以便在系统重启时自动运行
  • 将自己复制到“启动”文件夹以便在系统重启时自动运行

因此,我们只要将“启动”文件夹、“我的文档”以及 注册表中新增的内容(文件路径)删除,系统环境就可以完全恢复原状 了


二、静态分析体验

静态分析与动态分析简单定义如下:


  • 静态分析:在不运行目标程序的情况下进行分析
  • 动态分析:在运行目标程序的同时进行分析

静态分析主要包括以下方法:


  • 阅读反汇编代码
  • 提取可执行文件中的字符串,分析使用了哪些单词

这里用到 chap01\\wsample01a\\Release 中的示例程序 wsample01a.exe


1、WinHex 查看文件内容

用 WinHex 打开 wsample01a.exe


可以看到这些内容:


  • 字符串 MESSAGEHello! Windows
  • 文件路径 C:\\Documents and Settings\\XPMUser\\My Documents\\Visual Studio 2010\\Projects\\wsample01a\\Release\\wsample01a.pdb
  • 字符串 KERNEL32.dllMessageBoxW

主要是感受下


2、IDA 反汇编

将 wsample01a.exe 扔进 IDA:

也是感受下

跟源码对比下:


#include
#include
int APIENTRY _tWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)

if(lstrcmp(lpCmdLine, _T("2012")) == 0)
MessageBox(GetActiveWindow(),
_T("Hello! 2012"), _T("MESSAGE"), MB_OK);
else
MessageBox(GetActiveWindow(),
_T("Hello! Windows"), _T("MESSAGE"), MB_OK);

return 0;


三、动态分析体验

动态分析:


  • 在目标程序运行的同时跟踪其行为,主要用调试器来跟踪程序逻辑
  • 获取文件和注册表访问日志
  • 抓取网络包

这里用 chap01\\wsample01b\\Release 中的示例程序 wsample01b.exe


1、 Process Monitor 跟踪

为了跟踪程序,设置 Process Monitor 的过滤规则:


然后可以发现其行为类似于开头的 sample_mal.exe


2、OllyDbg 调试

调试器是一种帮助发现程序问题和 bug 的软件:


  • 断点
  • 单步跳入、跳出
  • 查看寄存器和内存数据


看看 00401000 之后的程序逻辑,发现程序依次调用了 GetModuleFileNameWSHGetFolderPathWlstrcatWCopyFileW 这几个函数

通过设置断点和单步前进可以了解每一步或者说上面每一个函数在做什么

同样与源代码对比:

#include
#include
int APIENTRY _tWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)

if(lstrcmp(lpCmdLine, _T("2012")) == 0)
MessageBox(GetActiveWindow(),
_T("Hello! 2012"), _T("MESSAGE"), MB_OK);
else
MessageBox(GetActiveWindow(),
_T("Hello! Windows"), _T("MESSAGE"), MB_OK);

return 0;


四、基础汇编指令

1、常用汇编指令

常用汇编指令如下:


指令示例含义说明
MOVMOV EAX,ECXEAX = ECX将 ECX 的值存入 EAX
ADDADD EAX,ECXEAX += ECX将 EAX 的值加上 ECX 的值
SUBSUB EAX,ECXEAX -= ECX将 EAX 的值减去 ECX 的值
INCINC EAXEAX++将 EAX 的值加 1
DECDEC EAXEAX–将 EAX 的值减 1
LEALEA EAX, [ECX+4]EAX = ECX+4将 ECX+4 的值存入 EAX
CMPCMP EAX,ECXif(EAX == ECX) ZF=1 elseZF=0对两个值进行比较并根据结果设置 标志若 EAX 与 ECX 相同,则 ZF=1 若 EAX 与 ECX 不同,则 ZF=0
TESTTEST EAX,EAXif(EAX == 0) ZF=1 elseZF=0将值与 0 进行比较并根据结果设置 标志若 EAX 为 0,则 ZF=1 若 EAX 不为 0,则 ZF=0
JE(JZ)JE 04001000if(ZF==1) GOTO 04001000若 ZF 为 1,则跳转到 04001000
JNE(JNZ)JNE 04001000if(ZF==0) GOTO 04001000若 ZF 为 0,则跳转到 04001000
JMPJMP 04001000GOTO 04001000无条件跳转到 04001000
CALLCALL lstrcmpW调用 lstrcmpW
PUSHPUSH 00000001将 00000001 入栈
POPPOP EAX出栈并将获取的值存入 EAX

JNZ 指令和 TEST 指令结合就是条件分支


2、参数存放在栈中

CALL 指令是用来调用子程序的,当我们用汇编语言编写子程序的时候,将返回值存放在 EAX 中,这是一种习惯

参数要通过 PUSH 指令存放在栈中:每当执行 PUSH 指令时,PUSH 的值就会被放入栈中


3、例子

一个 hello world 的汇编如下:

extern MessageBoxA
section .text
global main
main:
push dword 0
push dword title
push dword text
push dword 0
call MessageBoxA
ret
section .data
title: db 'MessageBox', 0
text: db 'Hello World!', 0

结语

主要是体验下几种最常用的逆向工具


推荐阅读
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 在幼儿园中,有 \( n \) 个小朋友需要通过投票来决定是否午睡。尽管这个问题对每个孩子来说并不是特别重要,但他们仍然希望通过谦让的方式达成一致。每个人都有自己的偏好,但为了集体和谐,他们决定采用一种最小割的方法来解决这一问题。这种方法不仅能够确保每个人的意愿得到尽可能多的尊重,还能找到一个最优的解决方案,使整体满意度最大化。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细探讨了C语言中`extern`关键字的简易编译方法,并深入解析了预编译、`static`和`extern`的综合应用。通过具体的代码示例,介绍了如何在不同的文件之间共享变量和函数声明,以及这些关键字在编译过程中的作用和影响。文章还讨论了预编译过程中宏定义的使用,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • C#编程指南:实现列表与WPF数据网格的高效绑定方法 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 优化后的标题:PHP分布式高并发秒杀系统设计与实现
    PHPSeckill是一个基于PHP、Lua和Redis构建的高效分布式秒杀系统。该项目利用php_apcu扩展优化性能,实现了高并发环境下的秒杀功能。系统设计充分考虑了分布式架构的可扩展性和稳定性,适用于大规模用户同时访问的场景。项目代码已开源,可在Gitee平台上获取。 ... [详细]
  • 提升工作效率:掌握这些技巧,IDEA 使用效率翻倍 | IDEA 高效操作指南
    提升工作效率:掌握这些技巧,IDEA 使用效率翻倍 | IDEA 高效操作指南 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 本文探讨了在 Silverlight 应用程序中实现多窗口界面的方法,通过引入浮动窗口组件,增强了应用的交互性和用户体验。该方案详细介绍了技术实现过程,包括窗口管理、布局调整及跨窗口通信机制,为开发者提供了实用的参考。 ... [详细]
  • 欢迎来到Netgen新时代:探索网络生成技术的无限可能
    欢迎进入Netgen的新时代:探索网络生成技术的无限潜力。本文将详细介绍如何编译下载的Netgen源代码,生成Netgen程序,并提供开发所需的库nglib。此外,还将探讨Netgen在现代网络设计与仿真中的应用前景,以及其在提高网络性能和可靠性方面的关键作用。 ... [详细]
  • 在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转
    本文探讨了在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转的技术细节。通过详细分析Swscale的工作原理和实际应用,展示了如何在Android环境中高效地进行图像格式转换。此外,还介绍了FFmpeg的全平台编译过程,包括x264和fdk-aac的集成,并在Ubuntu系统中配置Nginx和Nginx-RTMP-Module以支持直播推流服务。这些技术的结合为音视频处理提供了强大的支持。 ... [详细]
author-avatar
我爱你2602912303
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有